home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-20 | 11.7 KB | 453 lines | [TEXT/MMCC] |
- /*
- File: MenuStuff.c
- Contains: Menu handling routines.
- Written by: Jason Hodges-Harris & Don Swatman
- Copyright: © 1995 by Apple Computer, Inc., all rights reserved.
- */
-
- //==============================================
- // MenuStuff.c
- //
- // Creates and destroys the menu bar
- // Responds to user selecting menu item (mouse or keyboard)
- // Does all the calls to open a single movie or a master
- // and slave
- //==============================================
-
-
- #include <Fonts.h>
- #include <Devices.h>
- #include <ToolUtils.h>
-
- #include "MenuStuff.h"
-
- #include "WindStuff.h"
- #include "MovieStuff.h"
- #include "MoviePrefs.h"
-
- //----------------------------------------------
- // Define menubar constants
- //----------------------------------------------
-
- #define kMenuBar 128
-
- #define mApple 128
- #define iAbout 1
-
- #define mFile 129
- #define iOpen 1
- #define iOpenMS 2
- #define iClose 3
- #define iQuit 5
-
- #define mEdit 130
- #define iUndo 1
- #define iCut 3
- #define iCopy 4
- #define iPaste 5
-
-
- //----------------------------------------------
- // Create the menu bar
- //----------------------------------------------
-
- void MenuBarInit (void)
- {
- Handle menuBar;
- MenuHandle hMenu;
-
- // Create the menu bar
- menuBar = GetNewMBar(kMenuBar); // Get a menu bar resource
- SetMenuBar (menuBar); // Set the current menu bar to it
-
- hMenu = GetMHandle(mApple); // Get a handle to the apple Menu
- AddResMenu (hMenu,'DRVR'); // Attach the Desk Accessories on to the end
-
- DrawMenuBar(); // Ok, draw the menu bar
- }
-
- //==============================================
- // Various menu bar utilities
- //==============================================
-
- //----------------------------------------------
- // SetMenuItemEnabled
- //
- // Grays or Un grays a menu item
- // Returns true if something was enabled
- //----------------------------------------------
-
- Boolean SetMenuItemEnabled ( short menuID,
- short theItem,
- Boolean enableState );
- Boolean SetMenuItemEnabled ( short menuID,
- short theItem,
- Boolean enableState )
- {
- MenuHandle hMenu;
-
- hMenu = GetMHandle(menuID);
- if (enableState)
- EnableItem(hMenu, theItem);
- else
- DisableItem(hMenu, theItem);
- return ( enableState );
- }
-
- //----------------------------------------------
- // DoAdjustFileMenu
- //
- // Sets each item in the file menu
- //----------------------------------------------
-
- static Boolean DoAdjustFileMenu(WindowPtr window);
- static Boolean DoAdjustFileMenu(WindowPtr window)
- {
- short newWind; // throw away value used by IsFreeWind
- Boolean menuEnabled; // true if any item is enabled
- Boolean redrawMenuBar; // true if we need to redraw the menu bar
- static
- Boolean fileMenuEnabled = true; // This is a static so it'll hang around
- // Reflects whither the file menu is currently
- // grayed(false) or enabled(true)
-
- // Open needs just one free window
- menuEnabled = SetMenuItemEnabled( mFile, iOpen, IsFreeWind(&newWind, 1) );
-
- // Open master and slave needs 2 free windows
- menuEnabled |= SetMenuItemEnabled( mFile, iOpenMS, IsFreeWind(&newWind, 2) );
-
- // Close is ok if it's our window
- menuEnabled |= SetMenuItemEnabled( mFile, iClose, IsOurWindow( window ) );
-
- // Quit always enabled
- menuEnabled |= SetMenuItemEnabled( mFile, iQuit, true);
-
- // If nothing enabled the change then menu title to grayed out
- if (!menuEnabled)
- menuEnabled = SetMenuItemEnabled( mFile, 0, false);
-
- // If menu title has changed, then return the fact that we have
- // to redraw the menu bar
- redrawMenuBar = (fileMenuEnabled != menuEnabled);
- fileMenuEnabled = menuEnabled;
-
- return(redrawMenuBar);
- }
-
- //----------------------------------------------
- // DoAdjustEditMenu
- //
- // As we don't do use this menu, we just gray
- // the whole lot out
- //----------------------------------------------
-
- static Boolean DoAdjustEditMenu(WindowPtr window )
- {
- #pragma unused ( window )
-
- Boolean menuEnabled; // true if any item is enabled
- Boolean redrawMenuBar; // true if we need to redraw the menu bar
- short itemCount; // count down each menu item
- static
- Boolean editMenuEnabled = true; // This is a static so it'll hang around
- // Reflects whither the file menu is currently
- // grayed(false) or enabled(true)
-
- // Gray out all the items
- menuEnabled = false;
- for (itemCount = iUndo; itemCount <= iPaste; ++itemCount)
- menuEnabled |= SetMenuItemEnabled(mEdit, itemCount, false);
-
- // If nothing enabled then change the menu title to grayed out
- if (!menuEnabled)
- menuEnabled |= SetMenuItemEnabled( mEdit, 0, false);
-
- // If menu title has changed, then return the fact that we have
- // to redraw the menu bar
- redrawMenuBar = (editMenuEnabled != menuEnabled);
- editMenuEnabled = menuEnabled;
- return(redrawMenuBar);
- }
-
- //----------------------------------------------
- // DoAdjustMenus
- //
- // Adjust all the menu items and redraws the menu
- // bar if something has changed
- //----------------------------------------------
-
- void DoAdjustMenus(void)
- {
- WindowPtr window;
- Boolean redrawMenuBar;
-
- window = FrontWindow();
-
- redrawMenuBar = DoAdjustFileMenu ( window ); // Adjust the file menu
- redrawMenuBar |= DoAdjustEditMenu ( window ); // Adjust the edit menu
-
- // redraw the menu bar if one of the menu titles has changed
- if (redrawMenuBar)
- DrawMenuBar();
- }
-
-
- //----------------------------------------------
- // DoSlaveMovieTest
- //
- // Open two movies and slave one of the other
- //----------------------------------------------
-
- void DoSlaveMovieTest ( void );
- void DoSlaveMovieTest ( void )
- {
- OSErr theErr = noErr;
- short masterNum = -1; // window number of master window
- short slaveNum = -1; // window number of slave window
-
- // Check to see if there is room for 2 movies
- if (IsFreeWind(&masterNum, 2))
- {
- // Let the user change any of the preferences
- theErr = OneMoviePref( &gDefaultMoviePrefs, true );
- if (!theErr)
- {
-
- // Create the master movie in the master Window
- CreateWindow( masterNum, "\pMaster Movie", kWindAtFront );
- if (gTheWinds[masterNum])
- {
- // Create a movie
- theErr = OpenMovieWindow ( gTheWinds[masterNum], // WindowPtr
- kUserCloseWind, // Force user to close at end
- gDefaultMoviePrefs.hasController ); // Add controller if
- // user wants it
- if (!theErr)
- {
-
- // Create the slave movie Window
- if (IsFreeWind(&slaveNum, 1))
- {
- CreateWindow( slaveNum, "\pSlave Movie", gTheWinds[masterNum] );
- if (gTheWinds[slaveNum])
- {
- // Create a movie in the slave window
- theErr = OpenMovieWindow ( gTheWinds[slaveNum], // WindowPtr
- kUserCloseWind, // Force user to close at end
- kNoMovieController ); // No Movie Controller
-
- // Set up any changes to the masters movies rate
- if (!theErr)
- if (gDefaultMoviePrefs.rateChangeDelay)
- theErr = SetupMovieRate( gTheWinds[masterNum], gDefaultMoviePrefs.rateChangeDelay );
-
- // Set up the looping in the master movie - 20 seconds from start go back to 10 secs
- if (!theErr)
- if (gDefaultMoviePrefs.do20to10Loop)
- theErr = SetupLoop( gTheWinds[masterNum], 20, 10 );
-
- // Now hook the two movies together
- if (!theErr)
- theErr = SetupSlaveMovie( gTheWinds[masterNum],
- gTheWinds[slaveNum],
- gDefaultMoviePrefs.slaveAheadBy,
- gDefaultMoviePrefs.slaveStartDelay );
-
- // Display and order the windows
- if (!theErr)
- {
- // Show the windows
- ShowWindow( gTheWinds[slaveNum] );
- ShowWindow( gTheWinds[masterNum] );
-
- // Select the master window (as the front active window)
- SelectWindow ( gTheWinds[masterNum] );
-
- // Move slave window to be behind the master in the window list
- SendBehind (gTheWinds[slaveNum], gTheWinds[masterNum]);
-
- }
-
- // If we don't have a controller then start the movie
- if (!theErr)
- if (!gDefaultMoviePrefs.hasController)
- theErr = StartMovieWindow( gTheWinds[masterNum],kStartFromBegining );
-
- }
- }
- }
-
- // If we have an error, then close down the windows
- if (theErr)
- {
- if (masterNum != -1)
- CloseOurWindow( masterNum );
- if (slaveNum != -1)
- CloseOurWindow( slaveNum );
- }
- }
- // Adjust the menus, whatever happens
- DoAdjustMenus();
- }
- }
- }
-
-
- //----------------------------------------------
- // DoOpenWindow
- //
- // Open one movie using the options setup
- //----------------------------------------------
-
- void DoOpenWindow (void);
- void DoOpenWindow (void)
- {
- OSErr theErr;
- short windNum; // The windows number in the array
-
- // Check there is a free window
- if (IsFreeWind(&windNum,1))
- {
- // Get any options the user might want
- theErr = OneMoviePref( &gDefaultMoviePrefs, false );
- if (!theErr)
- {
-
- // Open a window
- CreateWindow( windNum, "\pUntitled", kWindAtFront );
- if (gTheWinds[windNum])
- {
- // Create a movie
- theErr = OpenMovieWindow ( gTheWinds[windNum], // windowPtr
- gDefaultMoviePrefs.closeAtEnd, // Users option for auto close
- gDefaultMoviePrefs.hasController ); // Users Option for controller
-
- // Set up the movie rate changes
- if (!theErr)
- if (gDefaultMoviePrefs.rateChangeDelay)
- theErr = SetupMovieRate( gTheWinds[windNum], gDefaultMoviePrefs.rateChangeDelay );
-
- // Set up the looping in the master movie - 20 seconds from start go back to 10 secs
- if (!theErr)
- if (gDefaultMoviePrefs.do20to10Loop)
- theErr = SetupLoop( gTheWinds[windNum],
- gDefaultMoviePrefs.loopFrom, gDefaultMoviePrefs.loopTo );
-
- // if no errors, then display the windows
- if (!theErr)
- {
- // Show the windows
- ShowWindow(gTheWinds[windNum]);
-
- // Select the window (as the front active window)
- SelectWindow ( gTheWinds[windNum] );
- }
-
- // If we don't have a controller then start the movie
- if (!theErr)
- if (!gDefaultMoviePrefs.hasController)
- theErr = StartMovieWindow( gTheWinds[windNum],kStartFromBegining );
-
- // If we've had an error, then remove the window and clean up
- if (theErr)
- {
- if (windNum != -1)
- CloseOurWindow( windNum );
- }
- }
- }
- // Adjust the menus, whatever happens
- DoAdjustMenus();
- }
- }
-
-
- //----------------------------------------------
- // DoMenuCommand
- //
- // Handles selection of items in menu
- //----------------------------------------------
-
- void DoMenuCommand(long menuResult)
- {
- short menuID;
- short menuItem;
- short daRefNum;
- Str255 daName;
- short windNum;
-
- // convert menuResult into menu and item
- menuID = HiWord(menuResult);
- menuItem = LoWord(menuResult);
-
- switch (menuID)
- {
-
- // Apple Menu
- case mApple:
- switch (menuItem)
- {
- // Display about box
- case iAbout:
- AboutBox();
- break;
-
- // Handle DA selected in Apple Menu
- default:
- GetItem(GetMHandle(mApple), menuItem, daName);
- daRefNum = OpenDeskAcc(daName);
- break;
- }
- break;
-
- // File Menu
- case mFile:
- switch (menuItem)
- {
-
- // Open a movie window
- case iOpen:
- DoOpenWindow ();
- break;
-
- // Open a master and slave movie windows
- case iOpenMS:
- DoSlaveMovieTest( );
- break;
- // Close front window
- case iClose:
- windNum = GetWindowNum ( FrontWindow() );
- if (windNum != -1 )
- CloseOurWindow( windNum );
- break;
- // User wants to quit so set gDone to True
- case iQuit:
- gDone=true;
- break;
- }
- break;
-
- // Edit Menu
- // Don't do anything
- case mEdit:
- switch (menuItem)
- {
- case iUndo:
- break;
- case iCut:
- break;
- case iCopy:
- break;
- case iPaste:
- break;
- }
- break;
-
- }
- // Un highlite the menu title
- HiliteMenu(0);
- }
-
-
-